#if !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200809L
#define _POSIX_C_SOURCE 200809L
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "preprocess.h"

// 分词函数：将字符串按空格分割成令牌数组
char** tokenize_string(const char* str, uint32_t* token_count) {
    if (!str || !token_count) {
        return NULL;
    }

    // 复制字符串，因为 strtok 会修改原字符串
    char* copy = strdup(str);
    if (!copy) {
        return NULL;
    }

    // 初始分配令牌数组
    uint32_t capacity = 10;
    uint32_t count = 0;
    char** tokens = malloc(capacity * sizeof(char*));
    if (!tokens) {
        free(copy);
        return NULL;
    }

    // 使用 strtok 分割字符串
    char* token = strtok(copy, " ");
    while (token != NULL) {
        // 检查是否需要扩容
        if (count >= capacity) {
            capacity *= 2;
            char** new_tokens = realloc(tokens, capacity * sizeof(char*));
            if (!new_tokens) {
                // 分配失败，释放已分配的内存
                for (uint32_t i = 0; i < count; i++) {
                    free(tokens[i]);
                }
                free(tokens);
                free(copy);
                return NULL;
            }
            tokens = new_tokens;
        }

        // 复制令牌
        tokens[count] = strdup(token);
        if (!tokens[count]) {
            // 分配失败，释放已分配的内存
            for (uint32_t i = 0; i < count; i++) {
                free(tokens[i]);
            }
            free(tokens);
            free(copy);
            return NULL;
        }
        count++;

        token = strtok(NULL, " ");
    }

    free(copy);
    *token_count = count;
    return tokens;
}

// 专门用于模板字符串的分词
char** tokenize_template(const char* template_str, uint32_t* token_count) {
    return tokenize_string(template_str, token_count);
}

// 释放分词结果
void free_tokens(char** tokens, uint32_t token_count) {
    if (!tokens) return;
    for (uint32_t i = 0; i < token_count; i++) {
        free(tokens[i]);
    }
    free(tokens);
}